package com.blog.cmrpersonalblog.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.blog.cmrpersonalblog.dto.tag.respnose.TagManagementResponse;
import com.blog.cmrpersonalblog.dto.tag.requset.TagQueryRequest;
import com.blog.cmrpersonalblog.entity.ArticleTag;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 标签管理Mapper接口
 */
@Mapper
public interface TagMapper extends BaseMapper<ArticleTag> {

    /**
     * 分页查询标签管理列表
     * @param page 分页参数
     * @param queryRequest 查询条件
     * @return 分页结果
     */
    IPage<TagManagementResponse> selectTagManagementPage(Page<TagManagementResponse> page, 
                                                        @Param("request") TagQueryRequest queryRequest);

    /**
     * 获取标签详情
     * @param tagId 标签ID
     * @return 标签详情
     */
    TagManagementResponse selectTagDetailById(@Param("tagId") Long tagId);

    /**
     * 根据名称查询标签（用于重名检查）
     * @param name 标签名称
     * @param excludeId 排除的标签ID（用于更新时检查）
     * @return 标签信息
     */
    ArticleTag selectTagByName(@Param("name") String name, @Param("excludeId") Long excludeId);

    /**
     * 批量更新标签状态
     * @param tagIds 标签ID列表
     * @param status 目标状态
     * @return 更新数量
     */
    int batchUpdateTagStatus(@Param("tagIds") List<Long> tagIds, 
                            @Param("status") Integer status);

    /**
     * 批量更新标签颜色
     * @param tagIds 标签ID列表
     * @param color 目标颜色
     * @return 更新数量
     */
    int batchUpdateTagColor(@Param("tagIds") List<Long> tagIds, 
                           @Param("color") String color);

    /**
     * 批量重置标签使用次数
     * @param tagIds 标签ID列表
     * @return 更新数量
     */
    int batchResetTagUseCount(@Param("tagIds") List<Long> tagIds);

    /**
     * 批量删除标签
     * @param tagIds 标签ID列表
     * @return 删除数量
     */
    int batchDeleteTags(@Param("tagIds") List<Long> tagIds);

    /**
     * 获取标签统计信息
     * @return 统计信息
     */
    Map<String, Object> selectTagStatistics();

    /**
     * 获取标签状态分布
     * @return 状态分布
     */
    List<Map<String, Object>> selectTagStatusDistribution();

    /**
     * 获取标签使用频率分布
     * @return 使用频率分布
     */
    List<Map<String, Object>> selectTagUsageDistribution();

    /**
     * 获取启用的标签列表（用于下拉选择）
     * @return 启用的标签列表
     */
    List<ArticleTag> selectEnabledTags();

    /**
     * 获取热门标签列表
     * @param limit 限制数量
     * @return 热门标签列表
     */
    List<ArticleTag> selectPopularTags(@Param("limit") Integer limit);

    /**
     * 获取最近创建的标签
     * @param limit 限制数量
     * @return 最近创建的标签列表
     */
    List<ArticleTag> selectRecentTags(@Param("limit") Integer limit);

    /**
     * 检查标签是否被文章使用
     * @param tagId 标签ID
     * @return 是否被使用
     */
    boolean isTagUsedByArticles(@Param("tagId") Long tagId);

    /**
     * 获取标签的文章数量
     * @param tagId 标签ID
     * @return 文章数量
     */
    Long selectArticleCountByTagId(@Param("tagId") Long tagId);

    /**
     * 获取标签的已发布文章数量
     * @param tagId 标签ID
     * @return 已发布文章数量
     */
    Long selectPublishedArticleCountByTagId(@Param("tagId") Long tagId);

    /**
     * 获取标签最近使用时间
     * @param tagId 标签ID
     * @return 最近使用时间
     */
    String selectTagLastUsedTime(@Param("tagId") Long tagId);

    /**
     * 获取标签最近使用的文章标题
     * @param tagId 标签ID
     * @param limit 限制数量
     * @return 文章标题列表
     */
    List<String> selectRecentArticleTitlesByTagId(@Param("tagId") Long tagId, @Param("limit") Integer limit);

    /**
     * 更新标签使用次数
     * @param tagId 标签ID
     * @param useCount 新的使用次数
     * @return 更新数量
     */
    int updateTagUseCount(@Param("tagId") Long tagId, @Param("useCount") Integer useCount);

    /**
     * 增加标签使用次数
     * @param tagId 标签ID
     * @return 更新数量
     */
    int incrementTagUseCount(@Param("tagId") Long tagId);

    /**
     * 减少标签使用次数
     * @param tagId 标签ID
     * @return 更新数量
     */
    int decrementTagUseCount(@Param("tagId") Long tagId);

    /**
     * 获取标签颜色分布统计
     * @return 颜色分布统计
     */
    List<Map<String, Object>> selectTagColorDistribution();

    /**
     * 搜索标签（用于自动完成）
     * @param keyword 关键词
     * @param limit 限制数量
     * @return 标签列表
     */
    List<ArticleTag> searchTags(@Param("keyword") String keyword, @Param("limit") Integer limit);

    /**
     * 获取相似标签（基于名称相似度）
     * @param tagName 标签名称
     * @param limit 限制数量
     * @return 相似标签列表
     */
    List<ArticleTag> selectSimilarTags(@Param("tagName") String tagName, @Param("limit") Integer limit);

    /**
     * 合并标签（将源标签的使用次数合并到目标标签）
     * @param sourceTagIds 源标签ID列表
     * @param targetTagId 目标标签ID
     * @return 操作结果
     */
    int mergeTags(@Param("sourceTagIds") List<Long> sourceTagIds, @Param("targetTagId") Long targetTagId);

    /**
     * 获取未使用的标签列表
     * @return 未使用的标签列表
     */
    List<ArticleTag> selectUnusedTags();

    /**
     * 清理未使用的标签
     * @param daysBefore 多少天前创建且未使用的标签
     * @return 清理数量
     */
    int cleanupUnusedTags(@Param("daysBefore") Integer daysBefore);

    /**
     * 获取标签趋势统计（按月统计）
     * @param months 统计月数
     * @return 趋势统计
     */
    List<Map<String, Object>> selectTagTrendStatistics(@Param("months") Integer months);
}
